<template>
  <div class="music-list">
    <div class="back" @click="$router.back()">
      <i class="icon-back"></i>
    </div>
    <h1 class="title" v-html="title"></h1>
    <div class="bg-image" :style="bgStyle" ref="bgImage">
      <div class="play-wrapper">
        <div @click="random" ref="playBtn" v-show="songs.length > 0" class="play">
          <i class="icon-play"></i>
          <span class="text">随机播放全部</span>
        </div>
      </div>
      <div class="filter" ref="filter"></div>
    </div>
    <div class="bg-layer" ref="layer"></div>
    <scroll :probeType="3" listenScroll @scroll="scroll" :data="songs" class="list" ref="list">
      <div class="song-list-wrapper">
        <song-list :songs="songs" :rank="rank" @select="selectItem"></song-list>
      </div>
      <div v-show="!songs.length" class="loading-container">
        <loading></loading>
      </div>
    </scroll>
  </div>
</template>
<script>
import Scroll from '@/components/scroll/scroll';
import SongList from '@/components/song-list/song-list';
import Loading from '@/components/loading/loading';
import { prefixStyle } from 'common/js/dom';
import { mapActions } from 'vuex';
import { playlistMixin } from 'common/js/mixin';

const RESERVED_HEIGHT = 40;
const transform = prefixStyle('transform');
const backdrop = prefixStyle('backdrop-filter');
export default {
  mixins: [playlistMixin],
  props: {
    bgImage: { type: String, default: '' },
    songs: { type: Array, default: [] },
    title: { type: String, default: '' },
    rank: { type: Boolean, default: false },
  },
  data() {
    return {
      scrollY: 0,
    };
  },
  computed: {
    bgStyle() {
      if (this.bgImage) {
        return `background-image:url(${this.bgImage}?param=1024y1024)`;
      } else {
        return '';
      }
    },
  },
  mounted() {
    // 图片的高度
    this.imageHeight = this.$refs.bgImage.clientHeight;
    // 最大能位移的距离
    this.maxTransalteY = -this.imageHeight + RESERVED_HEIGHT;
    this.$refs.list.$el.style.top = `${this.imageHeight}px`;
  },
  methods: {
    ...mapActions(['selectPlay', 'showToast', 'randomPlay']),
    handlePlaylist(playlisy) {
      const bottom = playlisy.length > 0 ? '60px' : '';
      this.$refs.list.$el.style.bottom = bottom;
      this.$refs.list.refresh();
    },
    selectItem(item, index) {
      if (item.canplay) {
        this.selectPlay({ list: this.songs, index });
      } else {
        this.showToast(item.reason);
      }
    },
    scroll(pos) {
      this.scrollY = pos.y;
    },
    random() {
      this.randomPlay(this.songs);
    },
  },
  watch: {
    scrollY(newY) {
      let zIndex = 0;
      let scale = 1;
      let blur = 0;
      const percent = Math.abs(newY / this.imageHeight);

      // 在下方滚动
      if (newY > 0) {
        zIndex = 10;
        scale = scale + percent;
        this.$refs.bgImage.style[transform] = `scale(${scale})`;
      } else {
        // 在上方滚动
        blur = Math.min(20, percent * 20);
        // 没有滚动到 上边界
        if (newY > this.maxTransalteY) {
          this.$refs.layer.style[transform] = `translate3d(0,${newY}px,0)`;
          this.$refs.filter.style[backdrop] = `blur(${blur}px)`;
          this.$refs.bgImage.style.paddingTop = '70%';
          this.$refs.bgImage.style.height = 0;
          this.$refs.playBtn.style.display = '';
        } else {
          // 滚动到边界了
          zIndex = 10;
          this.$refs.bgImage.style.paddingTop = 0;
          this.$refs.bgImage.style.height = `${RESERVED_HEIGHT}px`;
          this.$refs.playBtn.style.display = 'none';
        }
      }
      this.$refs.bgImage.style.zIndex = zIndex;
    },
  },
  components: {
    Scroll,
    SongList,
    Loading,
  },
};
</script>
<style scoped lang="stylus">
@import "~common/stylus/variable"
@import "~common/stylus/mixin"

.music-list
  position: fixed
  z-index: 100
  top: 0
  left: 0
  bottom: 0
  right: 0
  background: $color-background
  .back
    position absolute
    top: 0
    left: 6px
    z-index: 50
    .icon-back
      display: block
      padding: 10px
      font-size: $font-size-large-x
      color: $color-theme
  .title
    position: absolute
    top: 0
    left: 10%
    z-index: 40
    width: 80%
    no-wrap()
    text-align: center
    line-height: 40px
    font-size: $font-size-large
    color: $color-text
  .bg-image
    position: relative
    width: 100%
    height: 0
    padding-top: 70%
    transform-origin: top
    background-size: cover
    .play-wrapper
      position: absolute
      bottom: 20px
      z-index: 50
      width: 100%
      .play
        box-sizing: border-box
        width: 135px
        padding: 7px 0
        margin: 0 auto
        text-align: center
        border: 1px solid $color-theme
        color: $color-theme
        border-radius: 100px
        font-size: 0
        .icon-play
          display: inline-block
          vertical-align: middle
          margin-right: 6px
          font-size: $font-size-medium-x
        .text
          display: inline-block
          vertical-align: middle
          font-size: $font-size-small
    .filter
      position: absolute
      top: 0
      left: 0
      width: 100%
      height: 100%
      background: rgba(7, 17, 27, 0.4)
  .bg-layer
    position: relative
    height: 100%
    background: $color-background
  .list
    position: fixed
    top: 0
    bottom: 0
    width: 100%
    background: $color-background
    .song-list-wrapper
      padding: 20px 30px
</style>
